#pragma once
#ifndef _CONFIGURATION_H_
#define _CONFIGURATION_H_
#ifdef WIN32
#pragma execution_character_set("utf-8")
#endif

#include <iostream>
#include <string>
#include <exception>
#include <sstream>
#include <QTextCodec>
#include <QFile>
#include <QString>
#include <QSettings>
#include "MyError.h"


using namespace std;

/// <summary>
/// 缓存文件路径以及时间配置信息
/// </summary>
typedef struct {

	int exposure;				//扫描相机的曝光时间

	int gain;					//扫描相机的增益值

	double whiteBalanceRed;		//白平衡系数-红

	double whiteBalanceGreen;	//白平衡系数-绿

	double whiteBalanceBlue;	//白平衡系数-蓝

	int frameWidth;				// 图像宽度

	int frameHeight;			// 图像高度

	int offsetX;				//起始X坐标

	int offsetY;				//起始Y坐标

	int fps;					//图像采集的帧率

	int frameCount;				//每次扫描采集的帧数

} CameraConfig;

/// <summary>
/// 相机标定 位移标定  光平面标定
/// </summary>
typedef struct {

	vector<double>CameraMatrix;//相机内参

	vector<double>disCoeffs;//畸变系数

	vector<double>Step;//位移标定参数

	vector<double>PlaneParam;//光平面标定参数

}caliParam;


/// <summary>
/// 串口参数配置
/// </summary>
typedef struct {

	int scannSpeed;			//扫描速度

	int backSpeed;			//返回速度

	float eQuicken;		    //加速电流

	float eWork;			//工作电流

	float eAwait;			//保持电流

	int accelerated;		//启动加速度

	int retarded;			//停止加速度

	int motoMcs;			//细分

	QString serialNum;		//串口号

	QString servoSerialNum;	//伺服串口号

	int rotateDirection;    //旋转方向 1:正向 0：反向

	int rotateCount;       //旋转圈数

} SerialPortConfig;

/// <summary>
/// 数据库配置信息
/// </summary>
typedef struct {

	QString host;		//主机地址

	int port;			//端口

	QString username;	//用户名

	QString password;	//密码

	QString database;	//数据库名

} DataBaseConfig;

/// <summary>
/// 设备信息信息
/// </summary>
typedef struct {

	QString name;			//仪器中文名称

	QString abbreviation;	//仪器英文名称

	QString version;		//仪器版本

	QString eVersion;		//电路版本

} EquipmentConfig;

/// <summary>
/// 运行环境配置信息
/// </summary>
typedef struct {

	bool devModel;			//是否是开发者模式

} EnvironmentConfig;

/// <summary>
/// Logo路径配置信息
/// </summary>
typedef struct {

	QString initLogo;		//界面初始化的logo

	QString homeLogo;		//主页Logo

	QString headerLogo;		//顶部logo

} LogoConfig;

/// <summary>
/// 日志配置信息
/// </summary>
typedef struct {

	int saveDays;			//日志保存天数

	QString path;			//日志保存路径

	QString level;			//日志级别

} LogConfig;

/// <summary>
/// 缓存文件路径以及时间配置信息
/// </summary>
typedef struct {

	int saveDays;			//图片缓存天数

	QString path;			//图片缓存位置

} CacheConfig;

/// <summary>
/// 设备信息信息
/// </summary>
typedef struct {

	QString phone;		//联系电话

	QString address;	//联系地址

	QString qrcode;		//二维码图片位置

} AboutUsConfig;

/// <summary>
/// 数据精度配置信息
/// </summary>
typedef struct {

	int area;				//面积精度

	int value;				//长度精度

} DataAccuracyConfig;

// lee图像处理信息
typedef struct {
	float pixelSize;

	float focalLength;

	float poleLength;

	vector<double> aCoefficients;

	vector<double> bCoefficients;

	float YD;//Y轴方向移动间隔
}ImageProcessConfig;


/*
	加载系统配置文件的类
*/
class Configuration {

public:

	/// <summary>
	/// 加载配置文件
	/// </summary>
	/// <returns></returns>
	static Configuration& getInstance();

	/// <summary>
	/// 保存配置文件信息
	/// </summary>
	/// <returns></returns>
	bool saveConfig();

private:

	/// <summary>
	/// 禁止外部构造
	/// </summary>
	Configuration();

	//禁止外部析构
	~Configuration();

	Configuration(const Configuration& other) = delete;

	Configuration& operator=(const Configuration& other) = delete;
public:
	/// <summary>
/// 数据库配置信息
/// </summary>
	typedef struct {

		QString host;		//主机地址

		int port;			//端口

		QString username;	//用户名

		QString password;	//密码

		QString database;	//数据库名

	} DataBaseConfig;
public:

	//相机配置对象
	CameraConfig camera;

	//标定参数对象
	caliParam caliParas;

	//串口配置对象
	SerialPortConfig serialPortConfig;

	//数据库配置对象
	DataBaseConfig database;

	//设备配置信息
	EquipmentConfig equipment;

	//运行环境配置信息
	EnvironmentConfig env;

	//logo配置信息
	LogoConfig logoPath;

	//日志配置信息
	LogConfig log;

	//缓存配置信息
	CacheConfig cache;

	//关于配置信息
	AboutUsConfig about;

	// 图像处理信息
	ImageProcessConfig imageProcessConfig;

	DataAccuracyConfig accuracy;		//数据精度
private:

	// 加载配置文件的对象
	QSettings* m_settings = nullptr;

};

#endif